iT邦幫忙

0

筆記 - Laravel-Sanctum 權杖發行

  • 分享至 

  • xImage
  •  

參考資料:

目的

快速發行給分離式前端使用的 Token

一、安裝 Sanctum

使用指令安裝:

composer require laravel/sanctum

建立設置:

php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"

執行 migrate:

貌似 Laravel 9 在建立專案時已經包含這個 migration ,因此沒執行是正常的

php artisan migrate

編輯 App/Http/Kernel.php 將 Middleware 添加至 api 中:

Laravel 9 預設就已經有了,將註解拿掉就好

'api' => [
    \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
    'throttle:api',
    \Illuminate\Routing\Middleware\SubstituteBindings::class,
],
如果不是使用預設的 Users 資料表登入的話:

則需要修改 config/sanctum.php,並在 guard 後面補上你在 config/auth.php 中新增的 guard

'guard' => ['web', 'store'],

二、取得 token

先編輯要使用 token 的 Model,加入 HasApiTokens

use Laravel\Sanctum\HasApiTokens;

class Store extends Authenticatable
{
    use HasApiTokens, HasFactory;
	...

之後就能使用 createToken 方法去產生 token:

$user->createToken('token-name')->plainTextToken;

三、範例

使用 AuthController 來實作 API 登入,並取得 token:

use Validator;
use Auth;

class AuthController extends Controller
{
    public function storeLogin (Request $request)
    {
        $validator = Validator::make($request->all(), [
            'username' => 'required',
            'password' => 'required|min:6',
        ]);

        if ($validator->fails()) return response()->json(['message' => $validator->errors()->first()], 400);

        if (Auth::guard('store')->attempt(['username' => $request->username, 'password' => $request->password])) {
            $store = Auth::guard('store')->user();
            return $store->createToken('jwt')->plainTextToken;
        }
        return response()->json(['message' => 'username or password incorrect'], 400);
    }
}

四、限制路由

編輯 routes/api.php,一樣將要受 token 保護的路由放入 middleware :

// 登入
Route::post('/store-login', 'App\Http\Controllers\AuthController@storeLogin');

Route::middleware(['auth:sanctum'])->group(function () {
    Route::get('/posts', function () {
        return '200';
    });
});

注意事項!!

如果 ID 不是整數,則需要修改資料表 personal_access_tokenstokenable_id 改為 String

public function up()
    {
        Schema::table('personal_access_tokens', function (Blueprint $table) {
            $table->string('tokenable_id')->change();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('personal_access_tokens', function (Blueprint $table) {
            $table->unsignedBigInteger('tokenable_id')->change();
        });
    }

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言